/*
 * ModeloNgramas.cpp
 *
 *  Created on: 26 Nov 2014
 *      Author: leo
 */
#include "ModeloNgramas.h"

Parser ModeloNgramas::par;

void ModeloNgramas::crearModeloDeNgramasDelArchivo(char* ruta)
{
	ModeloNgramas::par.cargarArchivo(ruta);

	while(!ModeloNgramas::par.archivoProcesado())
	{
		Tupla tuplaResultanteDeLaLineaLeida=ModeloNgramas::par.cargarSiguienteLinea();


		unigrama::instertarUnigramasDeTupla(tuplaResultanteDeLaLineaLeida);
		bigrama::instertarBigramasDeTupla(tuplaResultanteDeLaLineaLeida);
		trigrama::instertarTrigramasDeTupla(tuplaResultanteDeLaLineaLeida);

		tuplaResultanteDeLaLineaLeida.liberarRecursos();
		//delete tuplaResultanteDeLaLineaLeida;
	}

	par.cerrarArchivo();

	ModeloNgramas::dumpEstructurasDeDatos();
	ModeloNgramas::unificarArchivosTemporales();
}

void ModeloNgramas::unificarArchivosTemporales()
{
	trigrama::estructuraAsociada.unificarArchivosTemporales();

	bigrama::recolectarDatosDeTrigramas();
	bigrama::estructuraAsociada.unificarArchivosTemporales();

	unigrama::recolectarDatosDeBigramas();

	bigrama::estructuraAsociadaOrdenadaPorSegundoTermino.unificarArchivosTemporales();
	trigrama::estructuraAsociadaOrdenadaPorSegundoTermino.unificarArchivosTemporales();

	unigrama::recolectarDatosReordenados();

	unigrama::estructuraAsociada.unificarArchivosTemporales();
	ngram::estructuraAsociada.contadoresDeNgramas.dump();
	ngram::estructuraAsociada.unificarArchivosTemporales();
}

void ModeloNgramas::dumpEstructurasDeDatos()
{
	unigrama::dumpEstructurasAsociadas();
	bigrama::dumpEstructurasAsociadas();
	trigrama::dumpEstructurasAsociadas();

}

unsigned long int ModeloNgramas::obtenerFrecuenciaUnigrama(string termino)		//C
{
	unsigned long int frecuencia=unigrama::estructuraAsociada.obtenerFrecuencia(termino);



	if (frecuencia==0)
	{
		frecuencia= ModeloNgramas::obtenerDatoDesdeArchivo(termino,1,1,unigrama::RUTA_ARCHIVO_UNIGRAMAS);//ModeloNgramas::obtenerFrecuenciaDesdeArchivo(termino+" ",unigrama::RUTA_ARCHIVO_UNIGRAMAS);
	}

	return frecuencia;

}

unsigned long int ModeloNgramas::obtenerFrecuenciaBigrama(string termino1,string termino2)		//BC
{
	unsigned long int frecuencia=bigrama::estructuraAsociada.obtenerFrecuencia(termino1+" "+termino2);



	if (frecuencia==0)
	{
		frecuencia= ModeloNgramas::obtenerDatoDesdeArchivo(termino1+" "+termino2+" ",2,1,bigrama::RUTA_ARCHIVO_BIGRAMAS);
	}

	return frecuencia;

}

unsigned long int ModeloNgramas::obtenerFrecuenciaTrigrama(string termino1,string termino2,string termino3)		//ABC
{
	unsigned long int frecuencia=bigrama::estructuraAsociada.obtenerFrecuencia(termino1+" "+termino2+" "+ termino3);



	if (frecuencia==0)
	{
		frecuencia= ModeloNgramas::obtenerDatoDesdeArchivo(termino1+" "+termino2+" "+ termino3+" ",3,1,trigrama::RUTA_ARCHIVO_TRIGRAMAS);
	}

	return frecuencia;

}

unsigned long int ModeloNgramas::obtenerNroDeUnigramas()
{

	unsigned long int cantidad=estructuraAuxiliar::contadoresDeNgramas.obtenerFrecuencia("1-gramas");



		if (cantidad==0)
		{
			cantidad= ModeloNgramas::obtenerDatoDesdeArchivo("1-gramas ",1,1,ngram::RUTA_ARCHIVO_NGRAMAS);
		}

		return cantidad;

}

unsigned long int ModeloNgramas::obtenerNroDeBigramas()
{

	unsigned long int cantidad=estructuraAuxiliar::contadoresDeNgramas.obtenerFrecuencia("2-gramas");



		if (cantidad==0)
		{
			cantidad= ModeloNgramas::obtenerDatoDesdeArchivo("2-gramas ",1,1,ngram::RUTA_ARCHIVO_NGRAMAS);
		}

		return cantidad;

}

unsigned long int ModeloNgramas::obtenerNroDeTrigramas()
{

	unsigned long int cantidad=estructuraAuxiliar::contadoresDeNgramas.obtenerFrecuencia("3-gramas");



		if (cantidad==0)
		{
			cantidad= ModeloNgramas::obtenerDatoDesdeArchivo("3-gramas ",1,1,ngram::RUTA_ARCHIVO_NGRAMAS);
		}

		return cantidad;

}

unsigned long int ModeloNgramas::obtenerNroDeUnigramasConFreq(int freq)
{
	if(0<freq<=4)
	{
		char* m=new char[1];
		sprintf (m, "%d",freq );

	unsigned long int cantidad=estructuraAuxiliar::contadoresDeNgramas.obtenerFrecuencia("1-gramas-freq-"+(std::string)m);



		if (cantidad==0)
		{
			cantidad= ModeloNgramas::obtenerDatoDesdeArchivo("1-gramas-freq-"+(std::string)m+" ",1,1,ngram::RUTA_ARCHIVO_NGRAMAS);
		}
		delete m;
		return cantidad;
	}
	else
		return 0;


}

unsigned long int ModeloNgramas::obtenerNroDeBigramasConFreq(int freq)
{
	if(0<freq<=4)
	{
		char* m=new char[1];
		sprintf (m, "%d",freq );

	unsigned long int cantidad=estructuraAuxiliar::contadoresDeNgramas.obtenerFrecuencia("2-gramas-freq-"+(std::string)m);



		if (cantidad==0)
		{
			cantidad= ModeloNgramas::obtenerDatoDesdeArchivo("2-gramas-freq-"+(std::string)m+" ",1,1,ngram::RUTA_ARCHIVO_NGRAMAS);
		}
		delete m;
		return cantidad;
	}
	else
		return 0;
}

unsigned long int ModeloNgramas::obtenerNroDeTrigramasConFreq(int freq)
{
	if(0<freq<=4)
	{
		char* m=new char[1];
		sprintf (m, "%d",freq );

	unsigned long int cantidad=estructuraAuxiliar::contadoresDeNgramas.obtenerFrecuencia("3-gramas-freq-"+(std::string)m);



		if (cantidad==0)
		{
			cantidad= ModeloNgramas::obtenerDatoDesdeArchivo("3-gramas-freq-"+(std::string)m+" ",1,1,ngram::RUTA_ARCHIVO_NGRAMAS);
		}
		delete m;
		return cantidad;
	}
	else
		return 0;
}




unsigned long int ModeloNgramas::obtenerDatoDesdeArchivo(string representacion,int ngramas, int nroDeDato, const char* rutaArchivo)
{
	if (Parser::existeArchivo(rutaArchivo))
		{
		Parser par;
		par.cargarArchivo(rutaArchivo);
		bool finArchivo=false;

		while((!par.archivoProcesado())||(!finArchivo))
		{

			Tupla tuplaResultanteDeLaLinea=par.cargarSiguienteLinea();
			if (tuplaResultanteDeLaLinea.nroDeTerminos>0)
			{
				string representacionTupla="";
				for(int i=0; i<ngramas;i++)
				{
					representacionTupla+=tuplaResultanteDeLaLinea.tuplaDeTerminos[i]+" ";
				}

				if (representacion==representacionTupla)
				{
					par.cerrarArchivo();
					tuplaResultanteDeLaLinea.liberarRecursos();
					return (unsigned long int) atol(tuplaResultanteDeLaLinea.tuplaDeTerminos[ngramas-1+nroDeDato].c_str());
				}

			}
			else
				finArchivo=true;

			tuplaResultanteDeLaLinea.liberarRecursos();
		}

		return 0;
		}
	else
		return 0;



}


unsigned long int ModeloNgramas::obtenerNroDeUnigramasDistintosConFreq(string termino,int freq)
{
if((freq!=1)&&(freq!=2))
	freq=3;

return ModeloNgramas::obtenerDatoDesdeArchivo(termino+" ",1,1+freq,unigrama::RUTA_ARCHIVO_UNIGRAMAS);

}

unsigned long int ModeloNgramas::obtenerNroDeBigramasDistintosConFreq(string termino1,string termino2,int freq)
{
if((freq!=1)&&(freq!=2))
	freq=3;

return ModeloNgramas::obtenerDatoDesdeArchivo(termino1+" "+termino2+" ",2,1+freq,bigrama::RUTA_ARCHIVO_BIGRAMAS);

}



unsigned long int ModeloNgramas::obtenerNroDeTrigramasDistintos(string termino)
{

return ModeloNgramas::obtenerDatoDesdeArchivo(termino+" ",1,5,unigrama::RUTA_ARCHIVO_UNIGRAMAS);

}

unsigned long int ModeloNgramas::obtenerNroDeUnigramasDistintosAntes(string termino)
{

return ModeloNgramas::obtenerDatoDesdeArchivo(termino+" ",1,6,unigrama::RUTA_ARCHIVO_UNIGRAMAS);

}
